import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;

import javax.swing.*;
import javax.swing.border.BevelBorder;

/**
 * Fenêtre principale
 * 
 * @author H4201
 * 
 */
public class FenetrePrincipale extends JFrame {

	/**
	 * ID de la fenêtre
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * Bouton de lancement d'une commande
	 */
	private JButton bCommande;
	/**
	 * Bouton d'arrêt de la chaîne de production
	 */
	private JButton bArret;

	/**
	 * Bouton indiquant que les erreurs ont été réparées
	 */
	private JButton bErreursReparees;

	/**
	 * Bouton d'arrêt du lot en cours
	 */
	private JButton bArretLotEnCours;

	/**
	 * Bouton permettant de quitter l'application
	 */
	private JButton bQuitter;

	/**
	 * Champ de log
	 */
	private JTextArea tinfos;

	/**
	 * Voyants de statut
	 */
	private JPanel errAU, errPiece, errCarton, errImprimante, errPieceKO,
			errFile, errPalette, errEmbal;

	/**
	 * Constructeur de la FenetrePrincipale. Crée et affiche la fenêtre.
	 * 
	 * @param ctrl
	 *            Controleur principal
	 */
	public FenetrePrincipale(ControleurFenetrePrincipale ctrl) {

		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setTitle("Supervision de la chaîne de production");

		JPanel pan = new JPanel(new BorderLayout());
		JPanel panBouttons = new JPanel();
		JPanel panDroite = new JPanel(new BorderLayout());
		JPanel pErreurs = new JPanel();
		JPanel pErrText = new JPanel(new GridLayout(9, 1));
		JPanel pErrStatut = new JPanel(new GridLayout(9, 1));
		JPanel panGauche = new JPanel(new BorderLayout());
		JPanel panInfos = new JPanel(new FlowLayout(FlowLayout.LEFT));

		Dimension dimm = new Dimension(90, 30);
		Dimension dim = new Dimension(new JTextField().getSize());

		bQuitter = new JButton("Quitter");
		bQuitter.addActionListener(ctrl);
		bQuitter.setEnabled(false);
		bQuitter.setPreferredSize(dimm);
		bQuitter.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED, Color.GRAY, Color.DARK_GRAY));

		bArret = new JButton("Arrêt");
		bArret.addActionListener(ctrl);
		bArret.setPreferredSize(dimm);
		bArret.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED,
				Color.GRAY, Color.DARK_GRAY));

		bArretLotEnCours = new JButton("Arrêt lot");
		bArretLotEnCours.addActionListener(ctrl);
		bArretLotEnCours.setPreferredSize(dimm);
		bArretLotEnCours.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED, Color.GRAY, Color.DARK_GRAY));

		panBouttons.add(bArret);
		panBouttons.add(bArretLotEnCours);
		panBouttons.add(bQuitter);

		pan.add(panBouttons, BorderLayout.SOUTH);

		bErreursReparees = new JButton("Erreurs réparées");
		bErreursReparees.addActionListener(ctrl);
		bErreursReparees.setEnabled(false);
		bErreursReparees.setPreferredSize(dimm);
		bErreursReparees.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED, Color.GRAY, Color.DARK_GRAY));

		panDroite.add(bErreursReparees, BorderLayout.NORTH);

		pErrText.add(new JLabel("Statuts :"));
		JTextField magicField = new JTextField("lala");
		magicField.setVisible(false);
		pErrStatut.add(magicField);

		pErrText.add(new JTextField("Arrêt d'urgence"));
		errAU = new JPanel(new BorderLayout());
		errAU.setBackground(Color.GREEN);
		errAU.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
		pErrStatut.add(errAU);

		pErrText.add(new JTextField("Arrivée de pièces"));
		errPiece = new JPanel();
		errPiece.setBackground(Color.GREEN);
		errPiece.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED));
		errPiece.setSize(dim);
		pErrStatut.add(errPiece);

		pErrText.add(new JTextField("Carton présent"));
		errCarton = new JPanel();
		errCarton.setBackground(Color.GREEN);
		errCarton.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED));
		errCarton.setSize(dim);
		pErrStatut.add(errCarton);

		pErrText.add(new JTextField("Imprimante"));
		errImprimante = new JPanel();
		errImprimante.setBackground(Color.GREEN);
		errImprimante.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED));
		errImprimante.setSize(dim);
		pErrStatut.add(errImprimante);

		pErrText.add(new JTextField("Nb pièces défectueuses"));
		errPieceKO = new JPanel();
		errPieceKO.setBackground(Color.GREEN);
		errPieceKO.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED));
		errPieceKO.setSize(dim);
		pErrStatut.add(errPieceKO);

		pErrText.add(new JTextField("File de cartons"));
		errFile = new JPanel();
		errFile.setBackground(Color.GREEN);
		errFile.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
		errFile.setSize(dim);
		pErrStatut.add(errFile);

		pErrText.add(new JTextField("Palette présente"));
		errPalette = new JPanel();
		errPalette.setBackground(Color.GREEN);
		errPalette.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED));
		errPalette.setSize(dim);
		pErrStatut.add(errPalette);

		pErrText.add(new JTextField("Emballage"));
		errEmbal = new JPanel();
		errEmbal.setBackground(Color.GREEN);
		errEmbal.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED));
		errEmbal.setSize(dim);
		pErrStatut.add(errEmbal);

		pErreurs.add(pErrText);
		pErreurs.add(pErrStatut);

		panDroite.add(pErreurs, BorderLayout.SOUTH);

		pan.add(panDroite, BorderLayout.EAST);

		tinfos = new JTextArea();
		tinfos.setEditable(false);
		JScrollPane spInfos = new JScrollPane(tinfos);
		spInfos.setPreferredSize(new Dimension(350, 220));
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = gbc.gridy = GridBagConstraints.RELATIVE;
		gbc.weightx = 1;
		gbc.weighty = 6;
		gbc.gridheight = 3;
		gbc.gridwidth = 1;
		gbc.fill = GridBagConstraints.BOTH;

		panInfos.add(spInfos, gbc);

		bCommande = new JButton("Commande...");
		bCommande.addActionListener(ctrl);
		bCommande.setEnabled(false);
		bCommande.setPreferredSize(dimm);
		bCommande.setBorder(new javax.swing.border.BevelBorder(
				BevelBorder.RAISED, Color.GRAY, Color.DARK_GRAY));

		panGauche.add(bCommande, BorderLayout.NORTH);
		panGauche.add(new JLabel("Informations :"), BorderLayout.CENTER);
		panGauche.add(panInfos, BorderLayout.SOUTH);

		pan.add(panGauche, BorderLayout.WEST);
		pan.setBorder(BorderFactory.createCompoundBorder(
				BorderFactory.createEmptyBorder(8, 8, 8, 8), pan.getBorder()));

		setContentPane(pan);
		pack();
		setMinimumSize(getSize());
		setLocationRelativeTo(null);
		setVisible(true);
	}

	/**
	 * Spécifie si le bouton "Arrêt" est cliquable ou non
	 * 
	 * @param bool
	 *            Boléen indiquant si le bouton "Arrêt" est cliquable ou non
	 */
	public void setBArretEnable(boolean bool) {
		bArret.setEnabled(bool);
	}

	/**
	 * Spécifie si le bouton "Arrêt lot" est cliquable ou non
	 * 
	 * @param bool
	 *            Boléen indiquant si le bouton "Arrêt lot" est cliquable ou non
	 */
	public void setBArretLotEnable(boolean bool) {
		bArretLotEnCours.setEnabled(bool);
	}

	/**
	 * Spécifie si le bouton "Erreurs réparées" est cliquable ou non
	 * 
	 * @param bool
	 *            Boléen indiquant si le bouton "Erreurs réparées" est cliquable
	 *            ou non
	 */
	public void setBErreursRepareesEnable(boolean bool) {
		bErreursReparees.setEnabled(bool);
	}

	/**
	 * Ajoute le message passé en paramètre au champ de log
	 * 
	 * @param string
	 *            Message à ajouter
	 */
	public void addLog(String string) {
		tinfos.setText(tinfos.getText() + string + "\n");
	}

	/**
	 * Accesseur au bouton "Commande"
	 * 
	 * @return Bouton "Commande"
	 */
	public JButton getbCommande() {
		return bCommande;
	}

	/**
	 * Accesseur au bouton "Arrêt"
	 * 
	 * @return Bouton "Arrêt"
	 */
	public JButton getbArret() {
		return bArret;
	}

	/**
	 * Accesseur au bouton "Commande"
	 * 
	 * @return Bouton "Commande"
	 */
	public JButton getbErreursReparees() {
		return bErreursReparees;
	}

	/**
	 * Accesseur au bouton "Arrêt lot"
	 * 
	 * @return Bouton "Arrêt lot"
	 */
	public JButton getbArretLotEnCours() {
		return bArretLotEnCours;
	}

	/**
	 * Accesseur au bouton "Quitter"
	 * 
	 * @return Bouton "Quitter"
	 */
	public JButton getbQuitter() {
		return bQuitter;
	}

	/**
	 * Accesseur au voyant correspondant au numéro d'erreur passé en paramètre
	 * 
	 * @param numErreur
	 *            Numéro d'erreur
	 * @return Voyant correspondant au numéro d'erreur passé en paramètre
	 */
	public JPanel getErreur(int numErreur) {
		switch (numErreur) {
		case 0:
			return errAU;
		case 1:
			return errPiece;
		case 2:
			return errCarton;
		case 3:
			return errImprimante;
		case 4:
			return errPieceKO;
		case 5:
			return errFile;
		case 6:
			return errPalette;
		case 7:
			return errEmbal;
		}
		return null;
	}

	/**
	 * Après un arrêt du système, les seuls boutons cliquables sont les boutons
	 * "Commande" et "Quitter"
	 */
	public void arret() {
		bArret.setEnabled(false);
		bArretLotEnCours.setEnabled(false);
		bQuitter.setEnabled(true);
		bCommande.setEnabled(false);
	}

}
